#include <iostream>
#include "comm.hpp"
#include "InetAddr.hpp"

// ./tcpclient ip port
int main(int argc, char *argv[])
{
    if(argc != 3){
        std::cerr << "Usage->" << argv[0] << " ip port" << std::endl;
        exit(USAGE_ERR);
    }

    std::string ip = argv[1];
    uint16_t port = std::stoi(argv[2]);

    // 1.创建socket套接字
    int sockfd = socket(AF_INET, SOCK_STREAM, 0);
    if(sockfd < 0){
        std::cerr << "create tcp socket error";
        exit(SOCKET_ERR);
    }

    // 2.bind套接字信息，客户端不需要显式绑定，由操作系统随机指定端口号

    // 3.客户端也不需要listen监听，accept获取连接，这些都是服务端需要做的
    // 客户端只需要向服务端发起连接请求即可
    InetAddr addr(ip, port);
    int n = connect(sockfd, addr.NetAddr(), addr.Netaddrlen());
    if(n < 0){
        std::cerr << "connect error";
        exit(CONNECT_ERR);
    }

    // 4.发送请求
    while(true){
        std::cout << "please enter@";
        std::string message;
        std::getline(std::cin, message);
        write(sockfd, message.c_str(), sizeof(message));

        // 获取结果
        char buffer[1024];
        ssize_t n = read(sockfd, buffer, sizeof(buffer) - 1);
        if(n > 0){
            buffer[n] = 0;
            std::cout << buffer << std::endl;
        }
    }

    return 0;
}